/**
 * @file luogu/3071/main.cpp
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @brief
 * 有一排n个座位，m次操作。
 * [A]rrive 操作：将 a 名客人安置到最左的连续 a 个空位中，
 * 没有这样的座位则不操作。
 * [L]eave 操作：[a, b]的客人离开。
 * 求 A 操作的失败次数。
 * @see https://www.luogu.com.cn/problem/P3071
 * @see [Wrong Answer] https://www.luogu.com.cn/record/75269096
 * @version 1.0
 * @date 2022-05-06
 *
 * @copyright Copyright (c) 2022
 *
 **/

#include <bits/stdc++.h>
using namespace std;
#define ls (rt << 1)
#define rs (rt << 1 | 1)
#define mid (L + R >> 1)
const int NN = 5e5 + 4;
int opv[NN * 4],     // 下放标记位
    prefix[NN * 4],  // 区间连续 0 前缀
    suffix[NN * 4],  // 区间连续 0 后缀
    len[NN * 4];     // 区间最长连续 0 子区间
void maintain(int rt, int lLen, int rLen) {
  prefix[rt] = prefix[ls] == lLen ? lLen + prefix[rs] : prefix[ls];
  suffix[rt] = suffix[ls] == rLen ? rLen + suffix[ls] : suffix[rs];
  len[rt] = max({len[ls], len[rs], suffix[ls] + prefix[rs]});
}
void pushdown(int rt, int lLen, int rLen) {
  int &op = opv[rt];
  if (!op || !lLen || !rLen) return;
  len[ls] = prefix[ls] = suffix[ls] = (op == 2 ? lLen : 0);
  len[rs] = prefix[rs] = suffix[rs] = (op == 2 ? rLen : 0);
  opv[ls] = opv[rs] = op;
  op = 0;
}
/**
 * @brief 在 [L, R] 中查找长度为 q 的 0 区间
 *
 * @param rt 线段树根
 * @param L rt 管辖范围的左边界
 * @param R rt 管辖范围的右边界
 * @param q 需要的 0 区间的长度
 * @return int
 **/
int query(int rt, int L, int R, int q) {
  pushdown(rt, mid - L + 1, R - mid);
  if (len[ls] >= q) {
    return query(ls, L, mid, q);  // 去左半边找
  } else if (suffix[ls] + prefix[rs] >= q) {
    return mid - suffix[ls] + 1;  // 跨过中间线
  } else {
    return query(rs, mid + 1, R, q);  // 去右半边找
  }
}
/**
 * @brief 将 [qL, qR] 区间中所有座位的状态改为 op
 *
 * @param qL 询问区间的左端点
 * @param qR 询问区间的右端点
 * @param op 修改后状态
 * @param rt 当前子树的根节点
 * @param L rt 管辖范围的左端点
 * @param R rt 管辖范围的右端点
 **/
void update(int qL, int qR, int op, int rt, int L, int R) {
  if (qL <= L && R <= qR) {  // rt 被询问区间完全覆盖
    len[rt] = prefix[rt] = suffix[rt] = (op == 2 ? R - L + 1 : 0);
    opv[rt] = op;
    return;
  } else {
    pushdown(rt, mid - L + 1, R - mid);
    if (qL <= mid) update(qL, qR, op, ls, L, mid);
    if (qR >= mid + 1) update(qL, qR, op, rs, mid + 1, R);
    maintain(rt, mid - L + 1, R - mid);
  }
}

void build(int rt, int L, int R) {
  len[rt] = prefix[rt] = suffix[rt] = R - L + 1;
  if (L < R) {
    build(ls, L, mid), build(rs, mid + 1, R);
  }
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n, m, ans = 0;
  cin >> n >> m;
  build(1, 1, n);
  for (int i = 0; i < m; ++i) {
    char op;
    int a, b;
    cin >> op >> a;
    if (op == 'A') {
      if (len[1] < a)
        ans++;  // 分配失败，多一波不满意的客人
      else {
        int x = query(1, 1, n, a);
        update(x, x + a - 1, 1, 1, 1, n);
      }
    } else {
      int b;
      cin >> b;
      update(a, b, 2, 1, 1, n);
    }
  }
  printf("%d\n", ans);
}
